#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDir>
#include <QMessageBox>
#include <QFileInfo>
#include <QTextCodec>
#include <QFile>
#include <QDebug>
#include <QInputDialog>

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置树控件的列标题，并启用复选框
    ui->treeWidget->setHeaderLabels({ "文件路径" });
    ui->treeWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); // 允许多选
    ui->treeWidget->setColumnCount(1);

    // 初始化路径标签
    ui->label_Path->setText("未选择文件或文件夹");

    // 初始化图标
    folderIcon = QIcon(":/new/prefix1/icon/folder.svg");
    cFileIcon = QIcon(":/new/prefix1/icon/suffix-c.svg");
    cppFileIcon = QIcon(":/new/prefix1/icon/suffix-cpp.svg");
    hFileIcon = QIcon(":/new/prefix1/icon/suffix-h.svg");
    txtFileIcon = QIcon(":/new/prefix1/icon/suffix-txt.svg");

    // 连接 itemChanged 信号到槽函数
    connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &MainWindow::onTreeWidgetItemChanged);

    // 初始化过滤关键字列表
    filterKeywords.clear();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_SelectDocument_clicked()
{
    // 打开文件选择对话框
    QString filePath = QFileDialog::getOpenFileName(this, "选择文本文件", QDir::homePath(), "文本文件 (*.c *.cpp *.h *.txt)");
    if (filePath.isEmpty())
    {
        return; // 用户取消选择
    }

    // 更新路径标签
    updatePathLabel(filePath);

    // 清空树控件（因为只选择了一个文件）
    ui->treeWidget->clear();

    // 在树控件中添加文件
    QTreeWidgetItem* item = new QTreeWidgetItem();
    item->setText(0, QFileInfo(filePath).fileName());
    item->setData(0, Qt::UserRole, filePath); // 存储完整路径
    item->setCheckState(0, Qt::Checked);      // 添加复选框，默认勾选
    ui->treeWidget->addTopLevelItem(item);

    // 根据文件扩展名设置图标
    QString suffix = QFileInfo(filePath).suffix().toLower();
    if (suffix == "c")
    {
        item->setIcon(0, cFileIcon);
    }
    else if (suffix == "cpp")
    {
        item->setIcon(0, cppFileIcon);
    }
    else if (suffix == "h")
    {
        item->setIcon(0, hFileIcon);
    }
    else if (suffix == "txt")
    {
        item->setIcon(0, txtFileIcon);
    }

    ui->treeWidget->addTopLevelItem(item);
}

void MainWindow::on_pushButton_SelectFolder_clicked()
{
    // 打开文件夹选择对话框
    QString folderPath = QFileDialog::getExistingDirectory(this, "选择文件夹", QDir::homePath());
    if (folderPath.isEmpty())
    {
        return; // 用户取消选择
    }

    currentPath = folderPath;

    // 更新路径标签
    updatePathLabel(folderPath);

    // 清空树控件
    ui->treeWidget->clear();

    // 递归填充树控件
    populateTreeWidget(folderPath, nullptr);
}

void MainWindow::populateTreeWidget(const QString& folderPath, QTreeWidgetItem* parentItem)
{
    QDir dir(folderPath);
    if (!dir.exists())
    {
        QMessageBox::critical(this, "错误", "文件夹不存在！");
        return;
    }

    // 获取文件夹中的所有条目
    const QStringList entries = dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Readable);

    for (const QString& entry : entries)
    {
        QString fullPath = folderPath + "/" + entry;
        QFileInfo fileInfo(fullPath);

        // 检查是否需要过滤
        if (shouldFilter(entry))
        {
            continue; // 跳过被过滤的文件或文件夹
        }

        // 创建树节点
        QTreeWidgetItem* item = new QTreeWidgetItem();
        item->setText(0, fileInfo.fileName());
        item->setData(0, Qt::UserRole, fullPath); // 存储完整路径
        item->setCheckState(0, Qt::Checked);      // 添加复选框，默认勾选

        if (fileInfo.isDir()) // 如果是文件夹
        {
            // 设置文件夹图标
            item->setIcon(0, folderIcon);

            // 如果是文件夹，递归处理
            if (parentItem)
            {
                parentItem->addChild(item);
            }
            else
            {
                ui->treeWidget->addTopLevelItem(item);
            }
            populateTreeWidget(fullPath, item); // 递归调用
        }
        else if (fileInfo.isFile()) // 如果是目标类型的文本文件
        {
            // 根据文件扩展名设置图标
            QString suffix = fileInfo.suffix().toLower();
            if (suffix == "c")
            {
                item->setIcon(0, cFileIcon);
            }
            else if (suffix == "cpp")
            {
                item->setIcon(0, cppFileIcon);
            }
            else if (suffix == "h")
            {
                item->setIcon(0, hFileIcon);
            }
            else if (suffix == "txt")
            {
                item->setIcon(0, txtFileIcon);
            }

            // 如果是目标类型的文本文件，直接添加到树中
            QStringList supportedExtensions = { "c", "cpp", "h", "txt" };
            if (supportedExtensions.contains(fileInfo.suffix().toLower()))
            {
                if (parentItem)
                {
                    parentItem->addChild(item);
                }
                else
                {
                    ui->treeWidget->addTopLevelItem(item);
                }
            }
        }
    }
}

bool MainWindow::convertFileToUTF8(const QString& filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly))
    {
        ui->plainTextEdit->appendPlainText(QString("无法打开文件：%1").arg(filePath));
        return false;
    }

    // 读取文件内容
    QByteArray content = file.readAll();
    file.close();

    // 检测文件编码（这里假设文件可能是 GB2312 或 GB18030）
    QTextCodec* codec = QTextCodec::codecForName("GB18030");
    QString text = codec->toUnicode(content);

    // 保存为 UTF-8 编码
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        ui->plainTextEdit->appendPlainText(QString("无法保存文件：%1").arg(filePath));
        return false;
    }

    // 使用 QTextStream 写入 UTF-8 数据
    QTextStream out(&file);
    out.setEncoding(QStringConverter::Utf8); // Qt 6 中使用 setEncoding()
    out << text;
    file.close();

    ui->plainTextEdit->appendPlainText(QString("文件已转换为 UTF-8：%1").arg(filePath));
    return true;
}

void MainWindow::processCheckedItems(QTreeWidgetItem* item)
{
    if (!item)
    {
        return;
    }

    // 检查当前项是否被勾选
    if (item->checkState(0) == Qt::Checked)
    {
        // 如果是文件，则进行编码转换
        QString filePath = item->data(0, Qt::UserRole).toString();
        if (!filePath.isEmpty() && QFileInfo(filePath).isFile())
        {
            convertFileToUTF8(filePath);
        }
    }

    // 递归处理子项
    for (int i = 0; i < item->childCount(); ++i)
    {
        processCheckedItems(item->child(i));
    }
}

void MainWindow::on_pushButton_Execute_clicked()
{
    // 清空日志
    ui->plainTextEdit->clear();

    // 遍历树控件并处理所有勾选的文件
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i)
    {
        QTreeWidgetItem* topLevelItem = ui->treeWidget->topLevelItem(i);
        processCheckedItems(topLevelItem);
    }

    // 提示完成
    ui->plainTextEdit->appendPlainText("编码转换完成！");
}

void MainWindow::updatePathLabel(const QString& path)
{
    ui->label_Path->setText(path);
}

bool MainWindow::shouldFilter(const QString& fileName)
{
    // 检查是否包含过滤关键字
    for (const QString& keyword : filterKeywords)
    {
        if (fileName.contains(keyword, Qt::CaseInsensitive))
        {
            return true; // 包含关键字，跳过
        }
    }

    return false; // 不需要过滤
}

void MainWindow::onTreeWidgetItemChanged(QTreeWidgetItem* item, int column)
{
    if (!item || column != 0)
    {
        return;
    }

    // 获取当前复选框状态
    Qt::CheckState state = item->checkState(0);

    // 递归更新子节点的复选框状态
    for (int i = 0; i < item->childCount(); ++i)
    {
        QTreeWidgetItem* child = item->child(i);
        child->setCheckState(0, state);
    }
}

void MainWindow::on_pushButton_AddKeywords_clicked()
{
    bool ok;
    QString keyword = QInputDialog::getText(this, "添加关键字", "请输入过滤关键字:", QLineEdit::Normal, "", &ok);

    if (ok && !keyword.isEmpty())
    {
        // 检查是否已存在相同的关键词
        if (!filterKeywords.contains(keyword))
        {
            filterKeywords.append(keyword);   // 更新关键字列表
            ui->listWidget->addItem(keyword); // 添加到 QListWidget
        }
        else
        {
            QMessageBox::warning(this, "警告", "该关键字已存在！");
        }
    }
}

void MainWindow::on_pushButton_DeleteKeywords_clicked()
{
    QListWidgetItem* selectedItem = ui->listWidget->currentItem();
    if (selectedItem)
    {
        QString keyword = selectedItem->text();
        filterKeywords.removeAll(keyword); // 从关键字列表中移除
        delete selectedItem;               // 从 QListWidget 中移除
    }
    else
    {
        QMessageBox::warning(this, "警告", "请先选择一个关键字！");
    }
}
